public class code3s {
    public boolean isHappy(int n) {
        // 还有一种通过 快慢指针 解决的办法
        // 在这里的快慢指针，并不是链表上或者数组上的快慢指针
        // 而是在计算状态上的快慢！！

        // 起手就让 fast 多进行一步计算
        // 也就是所谓的 “快” 指针
        int slow = n;
        int fast = getNum(n);

        while(fast != 1 && slow != fast) {
            // 这里的判断条件可以看到
            // fast 总是比 slow 计算的快一步，如果不是快乐数 呢么 fast 和 slow 最终是会重复的

            // 始终让 slow 慢 fast 一步
            slow = getNum(slow);
            fast = getNum(getNum(fast));
        }

        // 同样的，判断最终的返回值是否为 1
        return fast == 1;
    }

    // 同样的，这里先创建出一个方法，计算每个位置上的数字的平方和
    private int getNum(int n) {
        int re = 0;
        while(n > 0) {
            // 获得个位上的数字
            int a = n % 10;
            // 更新 n 其他位置上的值
            n = n / 10;
            re += a * a;
        }
        return re;
    }
}
